<html>
<head>
    <meta charset="utf-8"/>
<meta name="description" content=""/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>

<title>Redis数据库简单学习 | 絷缘的博客</title>

<link rel="shortcut icon" href="https://zydnc.gitee.io/favicon.ico?v=1732378515642">

<link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://zydnc.gitee.io/styles/main.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/css/bootstrap.min.css">

<script src="https://cdn.jsdelivr.net/npm/@highlightjs/cdn-assets/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/highlight.js/9.15.10/languages/dockerfile.min.js"></script>
<script src="https://cdn.bootcss.com/highlight.js/9.15.10/languages/dart.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0/moment.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.min.js"></script>
<!-- DEMO JS -->
<!--<script src="media/scripts/index.js"></script>-->



    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.css">
 <script src='//unpkg.com/valine/dist/Valine.min.js'></script>
</head>
<body>
<div class="main gt-bg-theme-color-first">
    <nav class="navbar navbar-expand-lg">
    <div class="navbar-brand">
        <img class="user-avatar" src="/images/avatar.png" alt="头像">
        <div class="site-name gt-c-content-color-first">
            絷缘的博客
        </div>
    </div>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <i class="fas fa-bars gt-c-content-color-first" style="font-size: 18px"></i>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <div class="navbar-nav mr-auto" style="text-align: center">
            
                <div class="nav-item">
                    
                        <a href="/" class="menu gt-a-link">
                            首页
                        </a>
                    
                </div>
            
                <div class="nav-item">
                    
                        <a href="/archives" class="menu gt-a-link">
                            归档
                        </a>
                    
                </div>
            
                <div class="nav-item">
                    
                        <a href="/tags" class="menu gt-a-link">
                            标签
                        </a>
                    
                </div>
            
                <div class="nav-item">
                    
                        <a href="/about" class="menu gt-a-link">
                            关于
                        </a>
                    
                </div>
            
                <div class="nav-item">
                    
                        <a href="/friends" class="menu gt-a-link">
                            友链
                        </a>
                    
                </div>
            
        </div>
        <div style="text-align: center">
            <form id="gridea-search-form" style="position: relative" data-update="1732378515642" action="/search/index.html">
                <input class="search-input" autocomplete="off" spellcheck="false" name="q" placeholder="搜索文章" />
                <i class="fas fa-search gt-c-content-color-first" style="position: absolute; top: 9px; left: 10px;"></i>
            </form>
        </div>
    </div>
</nav>

    <div class="post-container">
        <div class="post-detail gt-bg-theme-color-second">
            <article class="gt-post-content">
                <h2 class="post-title">
                    Redis数据库简单学习
                </h2>
                <div class="post-info">
                    <time class="post-time gt-c-content-color-first">
                        · 2021-01-31 ·
                    </time>
                    
                        <a href="https://zydnc.gitee.io/redis/" class="post-tags">
                            # Redis
                        </a>
                    
                        <a href="https://zydnc.gitee.io/t-6x5ylCi/" class="post-tags">
                            # 数据库
                        </a>
                    
                        <a href="https://zydnc.gitee.io/qjuNtQyCB/" class="post-tags">
                            # 自学
                        </a>
                    
                </div>
                <div class="post-content">
                    <blockquote>
<p>redis是一款高性能的NOSQL系列的非关系型数据库（key-value）</p>
<p>官网：<a href="https://redis.io/">https://redis.io/</a></p>
<p>中文网：<a href="https://www.redis.net.cn/">https://www.redis.net.cn/</a></p>
</blockquote>
<h2 id="一-非关系型数据库">一、非关系型数据库</h2>
<h3 id="1-特点">1. 特点</h3>
<ul>
<li>数据之间没有关联关系</li>
<li>数据存储在内存中</li>
</ul>
<h3 id="2-解决的问题">2. 解决的问题</h3>
<ul>
<li>经常查询的一些不会经常发生变化的数据
<ul>
<li>缓存思想
<ul>
<li>若缓存中存在，则直接从缓存数据库中查询数据并返回</li>
<li>若缓存中不存在，则到关系型数据库中查询，将查询到的结果放入缓存并返回</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="二-redis数据库">二、Redis数据库</h2>
<h3 id="1-下载">1. 下载</h3>
<ul>
<li>注意：官网并不支持下载Windows版本的Redis，所以微软出面制作了Windows版本的Redis，但是自16年开始更新到版本3.2.100就不在更新了，无奈，一群自愿者出来开始更新Windows版本的Redis</li>
<li>微软的：<a href="https://github.com/microsoftarchive/redis">https://github.com/microsoftarchive/redis</a></li>
<li>自愿者的：<a href="https://github.com/tporadowski/redis">https://github.com/tporadowski/redis</a></li>
</ul>
<h3 id="2-安装">2. 安装</h3>
<ul>
<li>下载zip压缩包，解压即可使用</li>
</ul>
<h3 id="3-配置">3. 配置</h3>
<ul>
<li><code>redis.windows.conf</code>：Redis的核心配置文件</li>
<li><code>redis-cli.exe</code>：Redis的客户端</li>
<li><code>redis-server.exe</code>：Redis的服务端</li>
</ul>
<h3 id="4-使用">4. 使用</h3>
<ul>
<li>双击<code>redis-server.exe</code>运行服务端</li>
</ul>
<figure data-type="image" tabindex="1"><img src="https://zydnc.gitee.io/post-images/1612089913395.jpg" alt="" loading="lazy"></figure>
<ul>
<li>双击<code>redis-cli.exe</code>运行客户端</li>
</ul>
<figure data-type="image" tabindex="2"><img src="https://zydnc.gitee.io/post-images/1612089943909.jpg" alt="" loading="lazy"></figure>
<h3 id="5-redis的学习">5. Redis的学习</h3>
<ul>
<li>Redis数据结构
<ul>
<li>key-value格式的数据
<ul>
<li>key都是字符串</li>
<li>value有5种不同的数据结构
<ul>
<li>字符串类型：string（String）</li>
<li>哈希类型：hash（map）</li>
<li>列表类型：list（linkedlist）</li>
<li>集合类型：set（无重复值）</li>
<li>有序集合类型：sortedset（有序且无重复值）</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="6-字符串类型">6. 字符串类型</h3>
<ul>
<li>存储：<code>set key value</code></li>
<li>获取：<code>get key</code></li>
<li>删除：<code>del key</code></li>
</ul>
<figure data-type="image" tabindex="3"><img src="https://zydnc.gitee.io/post-images/1612089960903.jpg" alt="" loading="lazy"></figure>
<h3 id="7-哈希类型">7. 哈希类型</h3>
<ul>
<li>存储：<code>hset key field value</code></li>
<li>获取：<code>hget key field</code> <code>hgetall key</code></li>
<li>删除：<code>hdel key field</code></li>
</ul>
<figure data-type="image" tabindex="4"><img src="https://zydnc.gitee.io/post-images/1612089979154.jpg" alt="" loading="lazy"></figure>
<h3 id="8-列表类型可重复">8. 列表类型（可重复）</h3>
<ul>
<li>可以添加一个元素到列表的头部或者尾部</li>
<li>添加
<ul>
<li><code>lpush key value</code>：将元素加到列表头部</li>
<li><code>rpush key value</code>：将元素加到列表尾部</li>
</ul>
</li>
<li>获取
<ul>
<li><code>lrange key start end</code>：获取范围内的列表元素</li>
<li><code>lrange key 0 -1</code>：获取列表中所有元素</li>
</ul>
</li>
<li>删除
<ul>
<li><code>lpop key</code>：从列表的头部删除元素，并将元素返回</li>
<li><code>rpop key</code>：从列表的尾部删除元素，并将元素返回</li>
</ul>
</li>
</ul>
<figure data-type="image" tabindex="5"><img src="https://zydnc.gitee.io/post-images/1612089997534.jpg" alt="" loading="lazy"></figure>
<h3 id="9-集合类型无重复">9. 集合类型（无重复）</h3>
<ul>
<li>存储：<code>sadd key value</code></li>
<li>获取：<code>smembers key</code>：获取set集合中所有元素</li>
<li>删除：<code>srem key value</code>：删除set集合中的某个元素</li>
</ul>
<figure data-type="image" tabindex="6"><img src="https://zydnc.gitee.io/post-images/1612090019457.jpg" alt="" loading="lazy"></figure>
<h3 id="10-有序集合类型有序无重复">10. 有序集合类型（有序无重复）</h3>
<ul>
<li>
<p>每个value对应一个double类型的浮点数，有序集合正是通过这个浮点数保证有序的</p>
</li>
<li>
<p>存储：<code>zadd key score value</code></p>
</li>
<li>
<p>获取：<code>zrange key start end</code></p>
<ul>
<li><code>zrange key 0 -1 withscores</code></li>
</ul>
</li>
<li>
<p>删除：<code>zrem key value</code></p>
</li>
</ul>
<figure data-type="image" tabindex="7"><img src="https://zydnc.gitee.io/post-images/1612090036401.jpg" alt="" loading="lazy"></figure>
<h3 id="11-通用命令">11. 通用命令</h3>
<ul>
<li>查询所有的键：<code>key *</code></li>
<li>查询指定键对应value的类型：<code>type key</code></li>
<li>删除指定的key-value：<code>del key</code></li>
</ul>
<figure data-type="image" tabindex="8"><img src="https://zydnc.gitee.io/post-images/1612090053842.jpg" alt="" loading="lazy"></figure>
<h3 id="12-持久化">12. 持久化</h3>
<ul>
<li>
<p>将内存中的数据存储到本地，就叫持久化数据</p>
</li>
<li>
<p>Redis持久化机制</p>
<ul>
<li>RDB：默认方式，不需要配置，默认就使用这种机制
<ul>
<li>在一定时间间隔中，检测key的变化情况，然后持久化数据</li>
</ul>
</li>
<li>AOF：日志记录的方式，可以记录每一条命令的操作，可以在每一次命令操作后，持久化数据</li>
</ul>
</li>
<li>
<p>配置文件 <code>redis.windows.conf</code></p>
<ul>
<li>
<p>RDB配置</p>
<ul>
<li>修改以下配置文件项</li>
</ul>
<pre><code class="language-ini">save 900 1
#   after 900 sec (15 min) if at least 1 key changed
save 300 10
#   after 300 sec (5 min) if at least 10 keys changed
save 60 10000
#   after 60 sec if at least 10000 keys changed
</code></pre>
<ul>
<li>重新启动 Redis，并指定配置文件：<code>redis-server.exe redis.windows.conf</code></li>
</ul>
</li>
<li>
<p>AOF配置</p>
<ul>
<li>修改以下配置文件项</li>
</ul>
<pre><code class="language-ini">appendonly no 
# 关闭AOF
appendonly yes
# 开启AOF
appendfsync always
# 每一次操作都进行持久化
appendfsync everysec
# 每隔一秒进行一次持久化
appendfsync no
# 不进行持久化
</code></pre>
<ul>
<li>重新启动Redis，并指定配置文件： <code>redis-server.exe redis.windows.conf</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="三-java操作redis">三、Java操作Redis</h2>
<h3 id="1-jedis">1. Jedis</h3>
<ul>
<li>导入maven依赖</li>
</ul>
<pre><code class="language-xml">&lt;!-- https://mvnrepository.com/artifact/redis.clients/jedis --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;redis.clients&lt;/groupId&gt;
    &lt;artifactId&gt;jedis&lt;/artifactId&gt;
    &lt;version&gt;3.3.0&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<ul>
<li>代码实现</li>
</ul>
<pre><code class="language-java">public class JedisDemo1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis(&quot;localhost&quot;,6379);
        jedis.set(&quot;password&quot;,&quot;123456&quot;);
        jedis.close();
    }
}
</code></pre>
<ul>
<li>前往客户端查看 <code>keys *</code>，可以看到password的key和值</li>
</ul>
<figure data-type="image" tabindex="9"><img src="https://zydnc.gitee.io/post-images/1612090073044.jpg" alt="" loading="lazy"></figure>
<h3 id="2-jedis操作5种redis数据结构">2. Jedis操作5种Redis数据结构</h3>
<ul>
<li>操作String类型</li>
</ul>
<pre><code class="language-java">public class JedisDemo1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis(&quot;localhost&quot;,6379);
        //操作String类型（String）
        jedis.set(&quot;password&quot;,&quot;123456&quot;);
        //操作哈希类型（HashMap）
        HashMap&lt;String, String&gt; hashmap = new HashMap&lt;String, String&gt;();
        hashmap.put(&quot;name&quot;,&quot;zhangsan&quot;);
        hashmap.put(&quot;age&quot;,&quot;69&quot;);
        hashmap.put(&quot;gender&quot;,&quot;male&quot;);
        jedis.hset(&quot;hashmap&quot;,hashmap);
        //操作列表类型（list）
        jedis.lpush(&quot;listB&quot;,&quot;a&quot;);
        jedis.lpush(&quot;listB&quot;,&quot;b&quot;);
        jedis.rpush(&quot;listB&quot;,&quot;c&quot;);
        //操作Set集合（set）
        jedis.sadd(&quot;set&quot;,&quot;a&quot;);
        jedis.sadd(&quot;set&quot;,&quot;b&quot;);
        //操作有序集合（SortedSet）
        jedis.zadd(&quot;zset&quot;,99,&quot;zhangsan&quot;);
        jedis.zadd(&quot;zset&quot;,69,&quot;lisi&quot;);
        jedis.zadd(&quot;zset&quot;,66,&quot;wangwu&quot;);
        jedis.close();
    }
}
</code></pre>
<figure data-type="image" tabindex="10"><img src="https://zydnc.gitee.io/post-images/1612090095314.jpg" alt="" loading="lazy"></figure>
<h3 id="3-string类型常用方法">3. String类型常用方法</h3>
<ul>
<li><code>setex(String key,int second,String value)</code>：增加字符串数据项并指定过期时间</li>
<li><code>set(String key,String value)</code>：增加字符串数据项（覆盖，已存在覆盖值）</li>
<li><code>setnx(String key,String value)</code>：增加字符串数据项（不覆盖，若已存在则不执行）</li>
<li><code>del(String key)</code>：删除指定键的字符串数据项</li>
<li><code>get(String key)</code>：获取指定键的字符串数据项的值</li>
<li><code>append(String key,String s)</code>：在指定键的字符串数据项的value后追加字符串</li>
<li><code>mset(String key1,String value1,String key2,String value2...)</code>：增加多条字符串数据项</li>
<li><code>mget(String key1,String key2...)</code>：获取指定键对应的多条数据项</li>
</ul>
<h3 id="4-hash类型常用方法">4. Hash类型常用方法</h3>
<ul>
<li><code>hset(String key,String key,String value)</code>：增加指定键的hash数据项</li>
<li><code>hset(String key,Map map)</code>：增加指定键对应的值加入hash数据项</li>
<li><code>hgetAll(String key)</code>：获取指定键对应的hash数据项</li>
<li><code>hkeys(String key)</code>：获取指定键对应的hash数据项的所有键</li>
<li><code>hvals(String key)</code>：获取指定键对应的hash数据项的所有值</li>
<li><code>hdel(String key,String k1,String k2...)</code>：从指定键对应的hash数据项中删除多个元素</li>
<li><code>hlen(String key)</code>：获取指定键对应的hash数据项的元素个数</li>
<li><code>hexists(String key,String k1)</code>：判断指定键对应的hash数据相中是否存在k1对应的元素</li>
</ul>
<h3 id="5-list类型常用方法">5. List类型常用方法</h3>
<ul>
<li><code>lpush(String key,String v1,String v2...)</code>：从list头部插入元素</li>
<li><code>rpush(String key,String v1,String v2...)</code>：从list尾部插入元素</li>
<li><code>lrange(String key,int start,int end)</code>：获取指定区间的list元素</li>
<li><code>lrem(String key,int n,String value)</code>：</li>
<li><code>lpop(String key)</code>：从list头部弹出一个元素</li>
<li><code>rpop(String key)</code>：从list尾部弹出一个元素</li>
<li><code>llen(String key)</code>：获取list的元素个数</li>
<li><code>lset(String key,int index,String value)</code>：修改list中指定索引处的值</li>
</ul>
<h3 id="6-set类型常用方法">6. Set类型常用方法</h3>
<ul>
<li><code>sadd(String key,String v1,Stirng v2...)</code>：增加指定键对应的set数据项</li>
<li><code>smembers(String key)</code>：获取指定键对应的set数据项的所有元素</li>
<li><code>srem(String key,String val)</code>：删除set中值为val的数据项</li>
<li><code>srem(String key,String v1,String v2...)</code>：删除set中值为v1，v2的数据项、</li>
<li><code>spop(String key)</code>：随机弹出set中一个元素</li>
<li><code>scard(String key)</code>：获取set集合的元素个数</li>
</ul>
<h3 id="7-sortedset类型常用方法">7. SortedSet类型常用方法</h3>
<ul>
<li><code>zadd(String key,Map map)</code>：增加指定件对应的zset数据项</li>
<li><code>zadd(String key,int score,int val)</code>：向zset中加入一个元素</li>
<li><code>zrange(String key,int start,int end)</code>：获取zset指定区间的元素值</li>
<li><code>zrangeWithScore(String key,int start,int end)</code>：获取zset指定区间的元素值和score</li>
<li><code>zrangeByScore(String key,int start,int end)</code></li>
<li><code>zrem(String key,String vlaue)</code>：删除zset例指定值的元素</li>
<li><code>zcard(String key)</code>：获取zset中元素的个数</li>
</ul>
<h2 id="四-jedis连接池">四、Jedis连接池</h2>
<h3 id="1-jedispool">1. JedisPool</h3>
<pre><code class="language-java">JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
config.setMaxWaitMillis(3000);
JedisPool jedisPool = new JedisPool(config,&quot;localhost&quot;,6379);
Jedis jedis = jedisPool.getResource();
jedis.set(&quot;key&quot;,&quot;value&quot;);
jedis.close();
</code></pre>
<h3 id="2-jedispool工具类">2. JedisPool工具类</h3>
<pre><code class="language-java">package com.zhiyuan.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.util.Properties;

public class JedisPoolUtils {
    private static JedisPool jedisPool;
    private JedisPoolUtils(){}
    static{
        Properties pros = new Properties();
        try {
            pros.load(JedisPoolUtils.class.getClassLoader().getResourceAsStream(&quot;jedis.properties&quot;));
            String host = pros.getProperty(&quot;Host&quot;);
            String port = pros.getProperty(&quot;Port&quot;);
            String maxTotal = pros.getProperty(&quot;MaxTotal&quot;);
            String maxIdle = pros.getProperty(&quot;MaxIdle&quot;);
            String maxWaitMillis = pros.getProperty(&quot;MaxWaitMillis&quot;);
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(Integer.parseInt(maxIdle));
            config.setMaxTotal(Integer.parseInt(maxTotal));
            config.setMaxWaitMillis(Integer.parseInt(maxWaitMillis));
            jedisPool = new JedisPool(config,host, Integer.parseInt(port));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
</code></pre>
<pre><code class="language-properties">Host=localhost
Port=6379
MaxTotal=50
MaxIdle=10
MaxWaitMillis=3000
</code></pre>
<blockquote>
<p>原文作者：絷缘<br>
作者邮箱：zhiyuanworkemail@163.com<br>
原文地址：<a href="https://zhiyuandnc.github.io/WvJdcATYk/">https://zhiyuandnc.github.io/WvJdcATYk/</a><br>
版权声明：本文为博主原创文章，转载请注明原文链接作者信息</p>
</blockquote>

                </div>
            </article>
        </div>

        
            <div class="next-post">
                <div class="next gt-c-content-color-first">下一篇</div>
                <a href="https://zydnc.gitee.io/3g0TLSILu/" class="post-title gt-a-link">
                    JS原生实现简单ajax请求
                </a>
            </div>
        

        

        

        

        <div class="site-footer gt-c-content-color-first">
    <div class="slogan gt-c-content-color-first">事实不以人的意志为转移</div>
    <div class="social-container">
        
            
                <a href="#" target="_blank">
                    <i class="fab fa-github gt-c-content-color-first"></i>
                </a>
            
        
            
                <a href="#" target="_blank">
                    <i class="fab fa-telegram gt-c-content-color-first"></i>
                </a>
            
        
            
                <a href="#" target="_blank">
                    <i class="fab fa-qq gt-c-content-color-first"></i>
                </a>
            
        
            
                <a href="#" target="_blank">
                    <i class="fab fa-bilibili gt-c-content-color-first"></i>
                </a>
            
        
            
        
            
        
            
        
            
        
            
        
            
        
            
        
            
        
            
        
    </div>
    <div class="footer-info">
        Copyright&ensp;&copy;&ensp;絷缘的博客<br/><a href="https://beian.miit.gov.cn/" target="_blank">晋ICP备20001723号-1</a>
    </div>
    <div>
        Theme by <a href="https://imhanjie.com/" target="_blank">imhanjie</a>, Powered by <a
                href="https://github.com/getgridea/gridea" target="_blank">Gridea | <a href="https://zydnc.gitee.io/atom.xml" target="_blank">RSS</a></a>
    </div>
</div>

<script>
  hljs.initHighlightingOnLoad()
</script>

    </div>
</div>
</body>
</html>
